﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using MyHotel.MyHotel_MHQuanLyNhanVien_BUS_Webservice;

namespace MyHotel
{
    public partial class frmQuanLyNhanVien : MyForm
    {
        private enum TrangThai { BinhThuong, Them, Sua };
        private TrangThai _trangthai;
        private NhanVien[] listNhanVien;
        private ChucVu[] listChucVu;
        private ChucVu[] listChucVuNhanVien;
        private int _idRowCurrent = 0;
        private int _indexCurrent = 0;

        public frmQuanLyNhanVien()
        {
            InitializeComponent();
            _trangthai = TrangThai.BinhThuong;
            dtNgaySinh.MaxDate = DateTime.Now;
        }

        public override MyForm Clone()
        {
            return new frmQuanLyNhanVien();
        }

        public override string getName()
        {
            return "frmQuanLyNhanVien";
        }

        private void setTrangThai(TrangThai tt)
        {
            _trangthai = tt;
            switch (tt)
            {
                case TrangThai.BinhThuong:
                    groupPanel1.Enabled = false;
                    panelCtl.Enabled = true;
                    break;
                case TrangThai.Them:
                    groupPanel1.Enabled = true;
                    panelCtl.Enabled = false;
                    break;
                case TrangThai.Sua:
                    groupPanel1.Enabled = true;
                    panelCtl.Enabled = false;
                    break;
                default:
                    break;
            }
        }

        public void setTrangThai()
        {
            txtTenNhanVien.Enabled = false;
            txtSoDienThoai.Enabled = false;
            txtDiaChi.Enabled = false;
            txtTenDangNhap.Enabled = false;
            dtNgaySinh.Enabled = false;
            txtTenDangNhap.BackColor = System.Drawing.SystemColors.Control;
            dtNgaySinh.BackColor = System.Drawing.SystemColors.Control;
            txtDiaChi.BackColor = System.Drawing.SystemColors.Control;
            txtSoDienThoai.BackColor = System.Drawing.SystemColors.Control;
            txtTenNhanVien.BackColor = System.Drawing.SystemColors.Control;
        }

        public void LoadDsNhanVien()
        {
            MHQuanLyNhanVienBUSWSSoapClient ws = new MHQuanLyNhanVienBUSWSSoapClient();
            listNhanVien = ws.getListNhanVien();

            dgvQuanLyNhanVien.DataSource = CreateDataTableFromListNhanVien(listNhanVien);
        }

        private ChucVu[] LoadDsChucVu()
        {
            MHQuanLyNhanVienBUSWSSoapClient ws = new MHQuanLyNhanVienBUSWSSoapClient();
            return ws.getListChucVu();
        }

        public void hienLenTextBox()
        {
            if (dgvQuanLyNhanVien.Rows.Count != 0)
            {
                int index = dgvQuanLyNhanVien.CurrentRow.Index;
                if (index < listNhanVien.Length)
                {
                    NhanVien nv = listNhanVien[_indexCurrent];

                    txtTenNhanVien.Text = nv.Ten;
                    txtTenDangNhap.Text = nv.Tendangnhap;
                    txtSoDienThoai.Text = nv.Sodienthoai;
                    dtNgaySinh.Value = nv.Ngaysinh;
                    txtDiaChi.Text = nv.Diachi;
                    txtMatKhau.Text = nv.Matkhau;
                    switchButtonHoatDong.Value = !nv.IsBlock;

                    MHQuanLyNhanVienBUSWSSoapClient ws = new MHQuanLyNhanVienBUSWSSoapClient();
                    listChucVuNhanVien = ws.getListChucVuByMaNV(nv.Manv);
                    if (listChucVu == null)
                    {
                        listChucVu = ws.getListChucVu();
                    }
                    SetListChucVu(listChucVu, listChucVuNhanVien);
                }
                else
                {
                    txtTenNhanVien.Text = string.Empty;
                    txtTenDangNhap.Text = string.Empty;
                    txtSoDienThoai.Text = string.Empty;
                    dtNgaySinh.Text = string.Empty;
                    txtDiaChi.Text = string.Empty;
                    txtMatKhau.Text = "12345";
                    switchButtonHoatDong.Value = true;
                    checkedListBoxChucVu.Items.Clear();
                }
            }
        }

        private void frmQuanLyNhanVien_Load(object sender, EventArgs e)
        {
            LoadDsNhanVien();
            listChucVu = LoadDsChucVu();
            //setTrangThai();
            //setTrangThaiSua();
            //setButtonAndText(false);
            //dgvQuanLyNhanVien.DataSource = MHQuanLyNhanVienBUS.getThongTinNhanVien();
            //this.reportViewer1.RefreshReport();
        }

        private void SetListChucVu(ChucVu[] chucvuAll, ChucVu[] chucvuNV)
        {
            int i = 0, j = 0;
            checkedListBoxChucVu.Items.Clear();
            for (i = 0; i < chucvuAll.Length; i++)
            {
                for (j = 0; j < chucvuNV.Length; j++)
                {
                    if (chucvuAll[i].Tenchucvu.Equals(chucvuNV[j].Tenchucvu))
                        break;
                }
                checkedListBoxChucVu.Items.Add(chucvuAll[i].Tenchucvu, j < chucvuNV.Length);
            }
        }

        private void dgvQuanLyNhanVien_SelectionChanged(object sender, EventArgs e)
        {

        }

        private DataTable CreateDataTableFromListNhanVien(NhanVien[] list)
        {
            DataTable table = new DataTable();
            table.Columns.Add("Ten", typeof(string));
            table.Columns.Add("Tendangnhap", typeof(string));
            table.Columns.Add("Ngaysinh", typeof(DateTime));
            table.Columns.Add("Diachi", typeof(string));
            table.Columns.Add("Sodienthoai", typeof(string));
            table.Columns.Add("Isblock", typeof(bool));

            foreach (NhanVien nv in list)
            {
                DataRow row = table.NewRow();
                row["Ten"] = nv.Ten;
                row["Tendangnhap"] = nv.Tendangnhap;
                row["Ngaysinh"] = nv.Ngaysinh;
                row["Diachi"] = nv.Diachi;
                row["Sodienthoai"] = nv.Sodienthoai;
                row["Isblock"] = nv.IsBlock;

                table.Rows.Add(row);
            }

            return table;
        }

        private NhanVien getNhanVienFromForm()
        {
            NhanVien nv = new NhanVien();
            nv.Ten = txtTenNhanVien.Text;
            nv.Tendangnhap = txtTenDangNhap.Text;
            nv.Sodienthoai = txtSoDienThoai.Text;
            nv.Ngaysinh = dtNgaySinh.Value;
            nv.Diachi = txtDiaChi.Text;
            nv.Matkhau = txtMatKhau.Text;
            nv.IsBlock = !switchButtonHoatDong.Value;

            return nv;
        }

        private void Them_Luu()
        {
            if (IsDataOK(true))
            {
                NhanVien nv = getNhanVienFromForm();
                MHQuanLyNhanVienBUSWSSoapClient ws = new MHQuanLyNhanVienBUSWSSoapClient();
                if (ws.kiemtraNhanVien_TonTai_TenDangNhap(nv.Tendangnhap))
                {
                    MessageBox.Show("Tên đăng nhập đã tồn tại!!", "Thông báo");
                }
                else
                {
                    int idNhanVien = ws.themNhanVien(nv);
                    if (idNhanVien != -1)
                    {
                        foreach (int id in checkedListBoxChucVu.CheckedIndices)
                        {
                            NhomNguoiDung nhomND = new NhomNguoiDung() { MaNhanVien = idNhanVien, MaNND = listChucVu[id].Machucvu };
                            ws.themNhomNguoiDung(nhomND);
                        }
                        MessageBox.Show("Thêm thành công!!", "Thông báo");
                        setTrangThai(TrangThai.BinhThuong);
                        LoadDsNhanVien();
                    }
                    else
                    {
                        MessageBox.Show("Thêm không thành công, vui lòng xem lại!!", "Thông báo");
                    }
                }
            }
        }



        private void Sua_Luu()
        {
            if (IsDataOK(true))
            {
                NhanVien nv = getNhanVienFromForm();
                NhanVien nvOld = listNhanVien[_indexCurrent];
                nv.Manv = nvOld.Manv;
                MHQuanLyNhanVienBUSWSSoapClient ws = new MHQuanLyNhanVienBUSWSSoapClient();
                if (ws.kiemtraNhanVien_TonTai_TenDangNhap(nv.Tendangnhap) && !nv.Tendangnhap.Equals(nvOld.Tendangnhap))
                {
                    MessageBox.Show("Tên đăng nhập đã tồn tại!!", "Thông báo");
                }
                else
                {
                    bool isSuaOK = ws.suaNhanVien(nv);
                    List<NhomNguoiDung> listThem = getListNhomNguoiThemMoi();
                    List<NhomNguoiDung> listXoa = getListNhomNguoiDungXoa();

                    foreach (NhomNguoiDung nnd in listThem)
                    {
                        ws.themNhomNguoiDung(nnd);
                    }

                    foreach (NhomNguoiDung nnd in listXoa)
                    {
                        ws.xoaNhomNguoiDung(nnd);
                    }

                    if (isSuaOK)
                    {
                        MessageBox.Show("Cập nhật thành công!!", "Thông báo");
                        setTrangThai(TrangThai.BinhThuong);
                        LoadDsNhanVien();
                        dgvQuanLyNhanVien.CurrentCell = dgvQuanLyNhanVien[0, _idRowCurrent];
                        dgvQuanLyNhanVien.CurrentCell = dgvQuanLyNhanVien[0, _idRowCurrent];
                    }
                    else
                    {
                        MessageBox.Show("Không thành công, vui lòng xem lại!!", "Thông báo");
                    }
                }
            }
        }

        private List<NhomNguoiDung> getListNhomNguoiDungXoa()
        {
            int i = 0;
            NhanVien nv = listNhanVien[_indexCurrent];
            List<NhomNguoiDung> listXoa = new List<NhomNguoiDung>();
            foreach (ChucVu cv in listChucVuNhanVien)
            {
                int count = checkedListBoxChucVu.CheckedIndices.Count;
                for (i = 0; i < count; i++)
                {
                    int id = checkedListBoxChucVu.CheckedIndices[i];
                    if (listChucVu[id].Tenchucvu.Equals(cv.Tenchucvu))
                        break;
                }
                if (i >= count)
                {
                    NhomNguoiDung nnd = new NhomNguoiDung() { MaChucVu = cv.Machucvu, MaNhanVien = nv.Manv };
                    listXoa.Add(nnd);
                }
            }
            return listXoa;
        }

        private List<NhomNguoiDung> getListNhomNguoiThemMoi()
        {
            int i = 0, j = 0;
            int count = checkedListBoxChucVu.CheckedIndices.Count;
            int length = listChucVuNhanVien.Length;
            NhanVien nv = listNhanVien[_indexCurrent];
            List<NhomNguoiDung> listThem = new List<NhomNguoiDung>();
            for (i = 0; i < count; i++)
            {
                int id = checkedListBoxChucVu.CheckedIndices[i];
                for (j = 0; j < length; j++)
                {
                    if (listChucVu[id].Tenchucvu.Equals(listChucVuNhanVien[j].Tenchucvu))
                        break;
                }
                if (j >= length)
                {
                    NhomNguoiDung nnd = new NhomNguoiDung() { MaChucVu = listChucVu[id].Machucvu, MaNhanVien = nv.Manv };
                    listThem.Add(nnd);
                }
            }
            return listThem;
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            switch (_trangthai)
            {
                case TrangThai.BinhThuong:
                    break;
                case TrangThai.Them:
                    Them_Luu();
                    break;
                case TrangThai.Sua:
                    Sua_Luu();
                    break;
                default:
                    break;
            } 
        }

        private void dgvQuanLyNhanVien_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            for (int i = 0; i < dgvQuanLyNhanVien.Rows.Count; i++)
            {
                dgvQuanLyNhanVien.Rows[i].Cells["STT"].Value = i + 1;
            }
        }

        private void Them_KhongLuu()
        {
            if (IsDataOK())
            {
                DialogResult result = MessageBox.Show("Nhân viên này sẽ không được thêm, bạn có chắc không!!!", "Thông Báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (result == DialogResult.Yes)
                {
                    setTrangThai(TrangThai.BinhThuong);
                }
            }
            else
            {
                setTrangThai(TrangThai.BinhThuong);
            }
        }

        private void Sua_KhongLuu()
        {
            if (IsDataOK())
            {
                DialogResult result = MessageBox.Show("Thông tin nhân viên sẽ không được cập nhật, bạn có chắc không!!!", "Thông Báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (result == DialogResult.Yes)
                {
                    setTrangThai(TrangThai.BinhThuong);
                }
            }
            else
            {
                setTrangThai(TrangThai.BinhThuong);
            }
        }

        private void btnKhongLuu_Click(object sender, EventArgs e)
        {
            switch (_trangthai)
            {
                case TrangThai.Them:
                    Them_KhongLuu();
                    break;
                case TrangThai.Sua:
                    Sua_KhongLuu();
                    break;
            }

            hienLenTextBox();
        }

        private bool IsDataOK(bool showAlert = false)
        {
            if (txtTenNhanVien.Text.Trim() == String.Empty)
            {
                if (showAlert)
                {
                    MessageBox.Show("Vui lòng điền tên nhân viên!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                txtTenNhanVien.Focus();
                txtTenNhanVien.SelectAll();
                return false;
            }
            if (dtNgaySinh.Text.Trim() == String.Empty)
            {
                if (showAlert)
                {
                    MessageBox.Show("Vui lòng điền ngày sinh nhân viên!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                dtNgaySinh.Focus();
                return false;
            }
            if (txtDiaChi.Text.Trim() == String.Empty)
            {
                if (showAlert)
                {
                    MessageBox.Show("Vui lòng điền địa chỉ nhân viên mới!", "Thêm", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                txtDiaChi.Focus();
                txtDiaChi.SelectAll();
                return false;
            }
            if (txtTenDangNhap.Text.Trim() == String.Empty)
            {
                if (showAlert)
                {
                    MessageBox.Show("Vui lòng điền tên đăng nhập nhân viên mới!", "Thêm", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                txtTenDangNhap.Focus();
                txtTenDangNhap.SelectAll();
                return false;
            }
            if (txtSoDienThoai.Text.Trim() == String.Empty)
            {
                if (showAlert)
                {
                    MessageBox.Show("Vui lòng điền số điện thoại nhân viên mới!", "Thêm", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                txtSoDienThoai.Focus();
                txtSoDienThoai.SelectAll();
                return false;
            }

            return true;
        }

        private void btnSua_Click(object sender, EventArgs e)
        {
            if (dgvQuanLyNhanVien.RowCount != 0)
            {
                setTrangThai(TrangThai.Sua);
                _idRowCurrent = dgvQuanLyNhanVien.CurrentRow.Index;
            }
        }
        private void btnThem_Click(object sender, EventArgs e)
        {
            setTrangThai(TrangThai.Them);

            txtTenNhanVien.Text = string.Empty;
            txtTenDangNhap.Text = string.Empty;
            txtSoDienThoai.Text = string.Empty;
            dtNgaySinh.Text = string.Empty;
            txtDiaChi.Text = string.Empty;
            txtMatKhau.Text = "12345";
            switchButtonHoatDong.Value = true;

            MHQuanLyNhanVienBUSWSSoapClient ws = new MHQuanLyNhanVienBUSWSSoapClient();
            ChucVu[] listchucvu = ws.getListChucVu();
            checkedListBoxChucVu.Items.Clear();
            foreach (ChucVu cv in listchucvu)
            {
                checkedListBoxChucVu.Items.Add(cv.Tenchucvu, CheckState.Unchecked);
            }
        }

        private void btnDong_Click(object sender, EventArgs e)
        {
            DialogResult dg = MessageBox.Show("Bạn có muốn thoát không!!!", "Thông Báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
            if (dg == DialogResult.Yes)
            {
                this.Close();
            }
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            if (dgvQuanLyNhanVien.RowCount != 0)
            {
                NhanVien nv = listNhanVien[_indexCurrent];
                DialogResult dg = MessageBox.Show("Xóa Nhân Viên : " + nv.Ten + ", Bạn có chắc không??", "Thông Báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
                if (dg == DialogResult.Yes)
                {
                    MHQuanLyNhanVienBUSWSSoapClient ws = new MHQuanLyNhanVienBUSWSSoapClient();
                    ws.xoaNhanVien(nv);
                    int index = dgvQuanLyNhanVien.CurrentRow.Index;
                    LoadDsNhanVien();
                    int count = dgvQuanLyNhanVien.Rows.Count;
                    if (count > 0)
                    {
                        if (index < count)
                        {
                            dgvQuanLyNhanVien.Rows[index].Selected = true;
                        }
                        else
                        {
                            dgvQuanLyNhanVien.Rows[index - 1].Selected = true;
                        }
                    }
                }
            }
        }
 
        private void btnResetMK_Click(object sender, EventArgs e)
        {
            NhanVien nv = listNhanVien[_indexCurrent];
            DialogResult result = MessageBox.Show("Nhân viên : " + nv.Ten + " sẽ bị Reset password, Bạn có chắc không??", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
            if (result == DialogResult.Yes)
            {
                MHQuanLyNhanVienBUSWSSoapClient ws = new MHQuanLyNhanVienBUSWSSoapClient();
                if (ws.resetMatKhau(nv.Manv))
                {
                    MessageBox.Show("Reset thành công!!");
                }
                else
                {
                    MessageBox.Show("Thất bại!!");
                }
            }
        }

        private void dgvQuanLyNhanVien_CurrentCellChanged(object sender, EventArgs e)
        {
            if (dgvQuanLyNhanVien.CurrentRow != null)
            {
                _indexCurrent = findIndexAfterSort();
                hienLenTextBox();
            }
        }

        private int findIndexAfterSort()
        {
            if (dgvQuanLyNhanVien.Rows.Count > 0)
            {
                int count = listNhanVien.Length;
                for (int i = 0; i < count; ++i)
                {
                    String tendangnhap = dgvQuanLyNhanVien.CurrentRow.Cells["Tendangnhap"].Value.ToString();
                    if (listNhanVien[i].Tendangnhap.Equals(tendangnhap))
                        return i;
                }
            }
            return 0;
        } 
    }
}
